Contenidos

logo

  • Instalación de software
  • Ventajas/Desventajas de R y RStudio
  • Entorno de trabajo
  • Objetos de trabajo
  • Instalación de Paquetes estadísticos
  • Tipos de Variables
  • Valores Especiales
  • Recursos en línea
  • Importar Datos de Fuentes Externas
  • Estadística Descriptiva Básica
  • Configuración de datos

Conceptos Previos- Funciones

“To understand computations in R, two slogans are helpful: Everything that exists is an object. Everything that happens is a function call.”- John Chambers


  • Una función define relaciones entre distintos objetos
  • Permite automatizar tareas
  • Las funciones pueden contener otras funciones (“anidadas”/“nested”)
  • Hay funciones tan complejas que requieren muchos argumentos, referencias, condiciones, etc.
  • Toda función tiene un nombre, un argumento (puede estar definido por defecto) y un cuerpo
  • Los resultados de las operaciones pueden arrojar advertencias (para considerar) o errores (la ejecución para). Gran parte de los errores y advertencias están programadas, pueden ser buscadas en la red.

Conceptos Previos- Funciones(2)

Ejemplo: “head”

  • ¿Cuántas filas entrega por defecto?
  • Esa especificación es un argumento por defecto
  • El cuerpo, no lo vemos
print.function(head)
## function (x, ...) 
## UseMethod("head")
## <bytecode: 0x0000000014b90c88>
## <environment: namespace:utils>
getAnywhere(head)[2]
## function (x, ...) 
## UseMethod("head")
## <bytecode: 0x0000000014b90c88>
## <environment: namespace:utils>

Conceptos Previos- Paquetes Estadísticos

  • Una de las características que hace la diferencia entre otros programas.
  • Un paquete estadístico contiene distintas funciones (comandos).
  • Son extensiones de R: Contienen código, datos y documentación estandarizada.
  • Los paquetes en general se alojan en repositorios (CRAN, MRAN, GitHub, and BioConductor).
  • Las librerías son un directorio local que contiene los paquetes instalados
  • En general las librerías tienen archivos de documentación similares a formato Latex, con información de sus versiones, la fuente, etc.

Conceptos Previos- Repositorio CRAN

  • Abra Rstudio y presione Alt + T + G (WIN) o Cmd+, [comma] (Chrome, Desktop), Option+Cmd+, [comma] (Safari, FireFox) (MAC)

Instalación de Paquetes Estadísticos

  • Abra Rstudio, cree un proyecto de nombre “Curso 2”,
  • Abra un Script, escriba en él y ejecútelo (Run)
set.seed(4321) #Creamos una semilla para la generación de datos, 
#de manera que los podamos reproducir
datos<- rnorm(200, 4, .5) #Generamos 200 números aleatorizados , con un promedio 4 y una desviación estándar de 0,5
#siguiendo distribución normal.
promedio_curso <- function(x) {sum(x)/length(x)} #creamos una función que suma 
#datos y los divide por su largo
print(promedio_curso(datos))
## [1] 4.026496
print(sum(datos)) #la suma de los datos
## [1] 805.2992
print(length(datos)) #el largo de los datos
## [1] 200
.libPaths() # get library location
## [1] "C:/Users/andre/Documents/R/win-library/4.0"
## [2] "C:/Program Files/R/R-4.0.2/library"
  • Algo que hacíamos en 2 ejecuciones, lo hicimos en una

Instalación de Paquetes Estadísticos(2)

  • Ingrese en la consola o en un Script, la instalación del paquete “dplyr”, install.packages("dplyr")
  • Habiendo hecho esto, usted está instalando el paquete, pero no lo ha activado ni lo ha abierto
  • Para activarlo momentáneamente (library(dplyr)).
    • Muchos autores no recomiendan “require”, sino “library” (https://stackoverflow.com/q/5595512/9975513)
    • Una ventaja de require es que entrega un valor binario si el paquete se cargó o no (VERDADERO/FALSO)
    • La amenaza es que si uno corre líneas de código, se obvia el error
    • Esto puede llevar a resultados erróneos (ej: aplicando funciones de otros paquetes con mismo nombre)
  • Existen otros argumentos de la función install.packages:
  • Ubicación de la librería, Repositorio (CRAN, MRAN, Bioconductor,local, etc.), instalar paquetes dependientes, etc.
  • Si no conoce el origen de una función, puede consultarlo anteponiendo “?” o utilizando la función help()
  • A veces, los paquetes estadísticos generan contradicciones entre sí (ej: plyr y dplyr). Para ello, se recomienda desactivar o “despegar” un paquete (detach(package:[NOMBRE_PAQUETE]))

#OPC 1- una lista de paquetes estadísticos. Por cada fila, verá si existe el paquete.
#Si no, lo instala sin preguntar desde un repositorio CRAN
if(!require(paquete1)){install.packages("paquete1")}
if(!require(paquete2)){install.packages("paquete2")}
if(!require(paquete3)){install.packages("paquete3")}
if(!require(paquete4)){install.packages("paquete4")}
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:

#OPC. 2- Vemos que una lista de paquetes estadísticos se encuentren instalados; 
#si no lo están, aparece un mensaje
for (n in c("paquete1", "paquete2", "paquete3", "paquete4", "paquete..."))
{
  if(!require(n,character.only=TRUE))
  {
   stop(paste0("El paquete '",n,"' no está instalado: por favor instálelo e inténtelo de nuevo!\n"));
   # install.packages(n) # Si prefiere que lo instale automátiamente.
  }
  library(n,character.only=TRUE)
}

Objetos de Trabajo

Almacenan datos, tienen distintas estructuras que le dan soporte. A continuación presentaremos las más básicas, junto con sus propiedades:

Vectores

  • Aloja elementos/valores del mismo tipo (Posteriormente podrá ver los Tipos de Variables)
  • De ahí que elementos de distintos tipos serán coercionados a adoptar el tipo de caracter
  • Permite tomar un rango de ellos, excluir otros elementos, especificar los que se obtendrán mediante un criterio lógico (VERDADERO/FALSO).
  • Son el fundamento de muchas otras estructuras.
  • Permite ser ordenado
  • Si se utilizan vectores de distinto largo, las funciones pueden reciclarse
  • Constructor de vectores, combine: c()

Factores

  • Son vectores que alojan variables de tipo categórico u ordinal
  • La ventaja es que las etiquetas se graban sólo una vez, en niveles (levels())
  • Por tanto, aloja un vector con valores enteros, dependiendo de la cantidad de valores únicos
  • Otra es que permite informar a otros algoritmos respecto al tipo de datos que alojan (ej. regresión logística) -as.character()

Listas

  • Contienen elementos de distintos tipos, hasta objetos, de manera ordenada
  • De ahí que pueden estar anidados entre ellos
  • Los elementos pueden no estar relacionados entre sí
  • La función list() permite generarla. Es opcional agregarle nombres a cada elemento, pero permite llamarlos con mayor facilidad.

Matrices

  • Forma tabular, bidimensional y de naturaleza homogénea
  • Coarta su formato si se incorporan elementos de distinto tipo
  • Admite nombres a sus dimensiones (dimnames)
  • Generalmente numéricos
  • [x,y]
  • Por defecto, de arriba a abajo (bycol=T)

Array

  • Tabla multidimensional
  • Tiene filas, columnas y otras capas

Data frame

  • Marco/Trama/Conjunto de Datos
  • Bidimensional
  • Heterogéneas
  • Similar a una base de datos .csv o una planilla excel (aunque más restringida)
  • Los nombres de las columnas no pueden estar vacíos (el programa los llenará)
  • Es un dataset que está organizado en columnas (cada columna con su nombre)
  • Cada columna debe contener valores del mismo tipo
  • Similar a las bases de datos de SAS o SPSS
  • Se entiende como una lista de vectores o factores con la misma extensión (largo length() de columna 1 será el mismo que el del resto de las columnas)
  • Propiedades names(), colnames(), rownames(), is.data.frame(), str(), attr(), dim()

Tibbles

  • Una nueva configuración de un data frame
  • No fuerza a las columnas de caracteres a comportarse como factores
  • No entrega nombres de columnas automáticamente
  • Más sensible: da más advertencias
  • Es más cauto al reciclar vectores
  • No recomendable para bases de datos medianos/grandes (>50,000x10) (preferible data.table’s)
  • Pueden ser incompatibles con algunos paquetes

Ejemplos, Objetos de Trabajo

  • ¿Lista o vector?
c(4,6,8,10)
## [1]  4  6  8 10

-¿Lista o vector?

c("d",6,"v",10)
## [1] "d"  "6"  "v"  "10"
  • Aquí vemos que una matriz puede tener 2 atributos: número de filas y número de columnas. ¿Cómo ordena los datos por defecto una matriz?
matrix(1:4, nrow = 2, ncol = 2) #ATRIBUTOS DE UNA MATRIZ,tener en cuenta para después
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
matrix(1:4, nrow = 2, ncol = 2)*matrix(c(46,57,32,88),nrow=2)
##      [,1] [,2]
## [1,]   46   96
## [2,]  114  352
  • Matriz o Array ¿?
x<-array(c(52,41,25,85,136,128,28,59,65,16,1,133),c(2,3,2))
dimnames(x)<-list(c("H","M"),c("desempleado","empleado","inactivo"),c("santiago","valparaiso"))
print(x)
## , , santiago
## 
##   desempleado empleado inactivo
## H          52       25      136
## M          41       85      128
## 
## , , valparaiso
## 
##   desempleado empleado inactivo
## H          28       65        1
## M          59       16      133
##... mmmm... dimnames...¿qué serán? (se verá después)

Tablas

  • De una vía o de 2
asistentes_curso_2020 <- 
  data.frame(condicion=c("Estudiante Doctorado",".","Académico", "Funcionario", "Estudiante Doctorado",".", "Estudiante Doctorado", "Académico", "Funcionario", ".", "Estudiante"),externo=c("interno", "externo", "interno", "interno", "interno", "externo", "interno", "interno", "interno",  "externo", "interno"),asistencia=c(4, 4, 2, 2, 4, 3, 4, 1, 4, 2, 4))

table(asistentes_curso_2020$condicion)
## 
##                    .            Académico           Estudiante 
##                    3                    2                    1 
## Estudiante Doctorado          Funcionario 
##                    3                    2
  • Argumento “Exclude”
table(asistentes_curso_2020$condicion, exclude=".")
## 
##            Académico           Estudiante Estudiante Doctorado 
##                    2                    1                    3 
##          Funcionario 
##                    2
  • Proporciones
prop.table(table(asistentes_curso_2020$condicion, exclude="."))
## 
##            Académico           Estudiante Estudiante Doctorado 
##                0.250                0.125                0.375 
##          Funcionario 
##                0.250
prop.table(asistentes_curso_2020$condicion) #requiere una tabla
## Error in sum(x): 'type' (character) de argumento no válido
  • De dos vías
prop.table(table(asistentes_curso_2020$condicion,
                 asistentes_curso_2020$externo #se incluye otra variable
                 ))
##                       
##                           externo    interno
##   .                    0.27272727 0.00000000
##   Académico            0.00000000 0.18181818
##   Estudiante           0.00000000 0.09090909
##   Estudiante Doctorado 0.00000000 0.27272727
##   Funcionario          0.00000000 0.18181818
  • Dirección (eje).
prop.table(table(asistentes_curso_2020$condicion,
                 asistentes_curso_2020$externo
                 ),margin= 2) #cambia la manera en que se calculan las proporciones
##                       
##                        externo interno
##   .                      1.000   0.000
##   Académico              0.000   0.250
##   Estudiante             0.000   0.125
##   Estudiante Doctorado   0.000   0.375
##   Funcionario            0.000   0.250
# 1 = proporciones por filas, 2= por columnas, NULL =frecuencias globales.
  • Si cambia el eje, pero también el margin, ¿qué ocurre?

  • margin.table, Calcula la suma de entradas de una tabla para determinado índice

margin.table(table(asistentes_curso_2020$condicion,
      asistentes_curso_2020$externo
),1)
## 
##                    .            Académico           Estudiante 
##                    3                    2                    1 
## Estudiante Doctorado          Funcionario 
##                    3                    2
margin.table(table(asistentes_curso_2020$condicion,
      asistentes_curso_2020$externo
),2)
## 
## externo interno 
##       3       8
  • la manera dplyr
library(janitor)
## Warning: package 'janitor' was built under R version 4.0.3
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
asistentes_curso_2020 %>% 
janitor::tabyl(condicion, externo) %>% 
  adorn_totals(c("row", "col")) %>% #añade un total para cada uno
  adorn_percentages("col") %>% #calcula porcentajes
  adorn_pct_formatting(2) #añade el símbolo de porcentaje y formatea, por ejemplo, cuántos decimales mostrar
##             condicion externo interno   Total
##                     . 100.00%   0.00%  27.27%
##             Académico   0.00%  25.00%  18.18%
##            Estudiante   0.00%  12.50%   9.09%
##  Estudiante Doctorado   0.00%  37.50%  27.27%
##           Funcionario   0.00%  25.00%  18.18%
##                 Total 100.00% 100.00% 100.00%

Ejemplo aplicado (no replicar)

  • Seleccionar velocidades altas en base a un vector de valores
  • Generar una matriz de distancia recorrida y velocidad (en mph)
if(!require(dplyr)){install.packages("dplyr")} #si no existe, se instala
library(dplyr) #cargo dplyr
data(cars) #cargo la base de datos cars de dplyr
glimpse(cars) # exploro los datos
## Rows: 50
## Columns: 2
## $ speed <dbl> 4, 4, 7, 7, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13,...
## $ dist  <dbl> 2, 10, 4, 22, 16, 10, 18, 26, 34, 17, 28, 14, 20, 24, 28, 26,...
vec_vels<-c(23,24,25) # vector de velocidades altas seleccionadas
cars %>% 
  dplyr::filter(speed %in% vec_vels) %>%  #filtro en base a un vector
  janitor::tabyl(speed, dist) #matriz de velocidad por distancia
##  speed 120 54 70 85 92 93
##     23   0  1  0  0  0  0
##     24   1  0  1  0  1  1
##     25   0  0  0  1  0  0

Indexación, Subconjuntos y Atributos, Objetos de Trabajo

  • Subset
print(c(1,2,3,4,5))[3]
## [1] 1 2 3 4 5
## [1] 3
#¿Y ahora?, ¿qué llama la atención?
print(c(1,2,3,4,5)[3:6])
## [1]  3  4  5 NA
#¿por qué aparece un error?
tryCatch(print(c(1,2,3,4,5)[3:6,6]), error = function(e) "ERROR") ## una función para que en caso de que arroje error, no interrumpa la ejecución del los scripts.
## [1] "ERROR"

Indexación, Subconjuntos y Atributos, Objetos de Trabajo 2

  • Propiedades de una base de datos data.frame
    • $ para seleccionar una columna de una base de datos
    • [,] que nos permiten visualizar determinados elementos de una base de datos
data("women")
dimnames(women)
## [[1]]
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15"
## 
## [[2]]
## [1] "height" "weight"
str(women)
## 'data.frame':    15 obs. of  2 variables:
##  $ height: num  58 59 60 61 62 63 64 65 66 67 ...
##  $ weight: num  115 117 120 123 126 129 132 135 139 142 ...
names(women)
## [1] "height" "weight"
women$height
##  [1] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
women[3,1]
## [1] 60
women[3,"height"]
## [1] 60
  • Ejemplo de un Tibble (requiere instalar un paquete). Véanlo como data.frame (as.data.frame(cbind(sexo=rep("H","M",8),sexo=rep(c("H","M","M","H"),2),tarea=c("auto","casa", "barrio", "cohete","hipopotamo","nieve","hijo","sal")))), vean sus propiedades, ¿qué cambió?
if(!require(tibble)){install.packages("tibble")};tibble::as_tibble(cbind(sexo=rep("H","M",8),sexo=rep(c("H","M","M","H"),2),objeto=c("auto","casa", "barrio", "cohete","hipopotamo","nieve","hijo","sal")))
## Loading required package: tibble
## Warning: package 'tibble' was built under R version 4.0.3
## Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if `.name_repair` is omitted as of tibble 2.0.0.
## Using compatibility `.name_repair`.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
## # A tibble: 8 x 3
##   sexo  V2    objeto    
##   <chr> <chr> <chr>     
## 1 H     H     auto      
## 2 H     M     casa      
## 3 H     M     barrio    
## 4 H     H     cohete    
## 5 H     H     hipopotamo
## 6 H     M     nieve     
## 7 H     M     hijo      
## 8 H     H     sal

Niveles de Medición

Niv. Medición Clasificación Orden Un. Medida Constante Cero Absoluto
Nominal X
Ordinal X X
Intervalo X X X
Razón X X X X


  • Variables categóricas, cualitativas, no métricas
    • Nominales
    • Ordinales
  • Variables cuantitativas, métricas
    • Continuas
    • Discretas
  • Escalas
    • De Intervalo
    • Razón o Proporción

Niveles de Medición (continuación)

\(^{Fuente: Ritchey, 2002, p. 47}\)

Tipos de Variables

Existen 5 tipos de variables (modos) básicas o “atómicas” en R (dependiendo del tipo de valores que se le asigna a cada objeto). Estos determinan cómo los datos serán formateados, mostrados y tratados (typeof([OBJETO]) y class([OBJETO]), por si quiere saber más enlace y enlace2).

  • Numérico (numeric): valores numéricos, incluye decimales. {2,1.5,3}

  • Entero (integer): números enteros, no incluye decimales. {4,8,34}

  • Caracter (character): Variables Cadena (alfanuméricas). "andres", "pedro"

  • Lógico (logical): valores lógicos, verdadero o falso. {TRUE/FALSE, 0/1}

Además, es posible tratar las variables (“casting”) como factores. En este caso, las variables corresponden a valores enteros que tienen etiquetas para los distintos valores. Por otra parte, existen estructuras más complejas (tipo abstracto), como las fechas (dttm, POSixct), que provienen de estas formas básicas y que van más allá del alcance de este taller

Otros Valores Especiales

  • NA (no disponibles), puede entenderse como valores perdidos. Tiende a ser recodificado como “99” o “999” (distinguir de los No Aplica, “88” o “888”)
  • La infinidad se entiende como Inf
  • NaN es un valor indefinido NaN (not a number)
  • Sólo hay una propiedad NULL, similar a largo 0
is.finite(c(2,3,4,5)/c(0,1)) # se recicla
## [1] FALSE  TRUE FALSE  TRUE
is.infinite(matrix(c(1,2,5),nrow=2,ncol=2)/matrix(c(0,4),nrow=2,ncol=2))  #va a reciclar la primera observación
##       [,1]  [,2]
## [1,]  TRUE  TRUE
## [2,] FALSE FALSE
is.nan(c(2/5,6/6,0/0))
## [1] FALSE FALSE  TRUE
is.na(c(1,2,NA,4,5))
## [1] FALSE FALSE  TRUE FALSE FALSE
complete.cases(c(1,2,NA,4,5))
## [1]  TRUE  TRUE FALSE  TRUE  TRUE
anyNA(c(1,2,NA,4,5))
## [1] TRUE
anyNA(c(1,2,3,4,5))
## [1] FALSE
is.null(c(1,2,3,4,5))
## [1] FALSE
is.null(c(1,2,NA,4,5))
## [1] FALSE
is.null(c())
## [1] TRUE
library(car) #cargo librería
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
car::recode(c(1,2,NA,4,5), "NA=99") #reemplazo el valor perdido por un número en particular
## [1]  1  2 99  4  5

Ejercicio 1

Juego de Cultura - La regla que aplicará es la siguiente: “a todas las palabras que digan deberán agregarle la frase ‘por celular’” - Sus compañeros dicen lo siguiente: c("Debo comprar tickets para mañana", "Qué bueno sería juntarnos", "Voy a preparar un jugo") - La función paste0 permite pegar elementos sin separación

objeto <- "silencio"
paste0("Simón dice", objeto)
## [1] "Simón dicesilencio"
#considere que no agrega espacios, por lo que debe agregarlos usted
paste0("Simón dice", ", \'", objeto,"\'")
## [1] "Simón dice, 'silencio'"
  • Genere un objeto con las palabras utilizadas por sus compañeros de juego
  • Agregue la frase “por celular”

Ejercicio 2

  • Cargue una base de datos de R llamada “ChickWeight”
  • Obtenga la suma del peso de los primeros 5 pollos
  • OPC1. Obtenga la media de todos los pollos (use recursos en-línea para aprender)
  • ¿Llegó a obtener un peso de 121.8183 kgs.)
  • OPC2. obtenga el resultado usando comas enseparador de decimales (outdec en internet)
  • OPC3. ¿Y qué tal todo esto con la desviación estandar, aunque utilizando el mismo separador de decimales?

Ejercicio 3

  • Usted ya instaló el paquete “dplyr”
  • El paquete dplyr contiene múltiples funciones y bases de datos que veremos más adelante (https://cran.r-project.org/web/packages/dplyr/dplyr.pdf)
  • Llame a la librería
  • Cargue la base de datos “starwars”
  • (Podría faltar el paquete magrittr, si el programa se lo pide, ¿sabría cómo instalarlo?)
  • Ejecute este código: starwars %>% dplyr::group_by(eye_color) %>% dplyr::summarise(promedio_altura_por_color_de_ojos=mean(height, na.rm=T))
  • Conversemos sobre lo que hizo

Fuentes

Prueba

Favor dirigirse al siguiente enlace y contestar